package org.example;


import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;



/**
 * QRCodeUtil 是一个用于解析二维码图片的工具类。
 */
public class QRCodeUtil {
    /**
     * 主函数，用于解析二维码图片并输出链接。
     * @param args 命令行参数（未使用）
     */
    public static void main(String[] args) {
        try {
            // 指定二维码图片路径
            String filePath = "C:\\Users\\陈楚珊\\Desktop\\软件杯参考资料\\微信图片_20240604203045.png";
            File imageFile = new File(filePath);
            // 读取图片
            BufferedImage image = ImageIO.read(imageFile);

            // 解析二维码
            Result result = decodeQRCode(image);
            if (result != null) {
                // 输出解析结果
                String url = result.getText();
                System.out.println("解析得到的链接: " + url);
            } else {
                // 未找到有效二维码
                System.out.println("未在图片中找到有效的二维码");
            }
        } catch (IOException e) {
            // 图片读取错误
            System.err.println("读取图片时发生错误: " + e.getMessage());
        } catch (NotFoundException e) {
            // 二维码解析错误
            System.err.println("解析二维码时发生错误: " + e.getMessage());
        }
    }

    /**
     * 解码给定的图片以尝试提取其中的二维码数据。
     * @param image 要解析的图片
     * @return 解析得到的数据，如果无法解析则返回null
     * @throws NotFoundException 如果无法找到二维码
     */
    private static Result decodeQRCode(BufferedImage image) throws NotFoundException {
        QRCodeReader reader = new QRCodeReader();
        // 将图片转换为二进制位图
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(
                new BufferedImageLuminanceSource(image)));
        // 设置解码提示信息
        Map<DecodeHintType, Object> hints = new HashMap<>();
        hints.put(DecodeHintType.CHARACTER_SET, "UTF-8"); // 指定字符编码为UTF-8
        try {
            // 尝试解码图片中的二维码
            return reader.decode(binaryBitmap, hints);
        } catch (Exception e) {
            // 如果解码失败，则抛出运行时异常
            throw new RuntimeException();
        }
    }

}

